package thss.mro.parser;

import java.util.BitSet;
import java.util.Iterator;
import java.util.Map;

import thss.mro.entity.Packet;
import thss.mro.entity.PacketField;
import thss.mro.entity.TemplateField;
import thss.mro.entity.template.ProtocolTemplate;
import thss.mro.util.Constants;
import thss.mro.util.QueryTester;
import thss.mro.util.Template;

/**
 * 数据包解析器（公共解析器，可用于单位为位的数据包解析）
 */
public class BitPacketParser implements IPacketParser{

	/**
	 * 解析数据
	 * @param type	-	协议类型
	 * @param data	-	字节流
	 */
	public Packet parse(ProtocolTemplate pt, byte[] data){
		Packet pack = new Packet();
		//按位解析：将各位数据放入BitSet中
		BitSet bs = new BitSet(data.length*8);
		int bitNo = 0;
		while(bitNo<data.length*8){
			boolean bitValue = getBitValue(data[bitNo/8],bitNo%8);
			bs.set(bitNo,bitValue);
			bitNo++;
		}
		//循环为协议各字段设置比特值
		Map.Entry entry = null;
		Iterator it = pt.getFieldChain().entrySet().iterator();
		int offset = 0;
		while (it.hasNext()){ 
			entry = (Map.Entry)it.next();
			TemplateField tplFld = (TemplateField)entry.getValue();
			PacketField packfd = new PacketField();
			packfd.setTemplateField(tplFld);
			packfd.setValue(bs.get(offset++));
			pack.addField(packfd);
		}
		return pack;
	}
	
	private boolean getBitValue(byte scr, int i) {
		switch (i) {
		case 7:
			return (scr & 1)==1;
		case 6:
			return (scr & 2)==2;
		case 5:
			return (scr & 4)==4;
		case 4:
			return (scr & 8)==8;
		case 3:
			return (scr & 16)==16;
		case 2:
			return (scr & 32)==32;
		case 1:
			return (scr & 64)==64;
		case 0:
			return (scr & 128)==128;
		default:
			return false;
		}
	}

	public static void main(String[] args){
		//测试位为单位的信元解析
		ProtocolTemplate pt = new Template().getTemplate(Constants.TEMPLATE_ID_SCPCELL_BODY+Template.SCPCellCodeLst.get(2));
		byte[] data = new byte[]{0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F};
		Packet pack = new BitPacketParser().parse(pt, data);
		for(int i=0;i<data.length*8;i++){
			System.out.print((Boolean)pack.getFieldValue("value"+i)+" ");
		}
		new QueryTester().parseObject(pack, 5);
	}
	
//	
//	public static void main(String[] args){
//
//		QueryTester qt = new QueryTester();//测试对象打印
//		int circulateNum = 100000; //测试循环次数
//		
//		//测试Cell解析
//		for(int i=0;i<100000;i++){
//			CellGenerator cg = new CellGenerator();
//			byte[] data = cg.getData();
////			qt.parseObject(cg.pack, 5);
//			PacketTemplate pt = new PacketParser().parse(Constants.PROTOCOL_TYPE_CELL,data);
////			qt.parseObject(pt, 5);
//			if(!Arrays.equals(cg.pack.getFieldChain().get("Data").getValue(),pt.getFieldChain().get("Data").getValue())){
//				System.err.println("ERROR!!!");
//				break;
//			}
//		}
//		System.out.println("Test OK!!!");
//		
//		//测试SCP解析
//		for(int i=0;i<100000;i++){
//			SCPGenerator scpG = new SCPGenerator();
//			byte[] data = scpG.getData();
////			qt.parseObject(scpG.pack, 5);
//			PacketTemplate pt = new PacketParser().parse(Constants.PROTOCOL_TYPE_SCP,data);
////			qt.parseObject(pt, 5);
//			if(!Arrays.equals(scpG.pack.getFieldChain().get("CheckCode").getValue(),pt.getFieldChain().get("CheckCode").getValue())){
//				System.err.println("ERROR!!!");
//				break;
//			}
//		}
//		System.out.println("Test OK!!!");
//		
//		//测试SCP生成耗时（本机上运行平均每秒可生成2万多SCP）
//		SCPGenerator scpG = new SCPGenerator();
//		long start1 = System.currentTimeMillis();
//		for(int i=0;i<circulateNum;i++){
//			byte[] data = scpG.getData();
//		}
//		long end1 = System.currentTimeMillis();   
//		System.out.println("生成"+circulateNum+"个SCP用时：" + (end1 - start1)+"毫秒");
//	}
	
}
